<?php  if ( ! defined('IN_DiliCMS')) exit('No direct script access allowed');
	
	class Plugin_manager {
        
        /**
         * 插件
         * 
         * @var array
         */
		var $active_plugins = array();
        
        /**
         * 模型插件
         * 
         * @var array 
         */
		var $active_model_plugins = array();
        
        /**
         * CI引用
         * 
         * @var object 
         */
		var $ci = NULL;
		
        /**
         * 构造函数
         */
		function __construct() {
			$this->ci = &get_instance();
			$this->_init();
		}
		
        /**
         * 初始化
         */
		private function _init() {
			if(file_exists(FCPATH.'settings/plugins'.EXT)) { //如果插件文件存在
				include_once(FCPATH.'settings/plugins'.EXT); //加载插件
				if(isset($setting['active_plugins'])) { //如果是激活过的插件 
					$this->active_plugins = $setting['active_plugins']['plugins']; //插件
					$this->active_model_plugins = $setting['active_plugins']['model_plugins']; //模型插件
					$this->_load_plugins($this->active_plugins);//此变量为 插件类组成的数组
					unset($setting['active_plugins']);
				}
			}
			if($this->ci->uri->rsegment(1) == 'category_content' || $this->ci->uri->rsegment(1) == 'content') { //如果是内容模型或分类模型，则加载模型(前面 + model)插件 
				$this->_load_plugins($this->active_model_plugins , 'model_');
			}
		}
		
        /**
         * 加载插件
         * 
         * @param string $plugins 插件信息数组
         * @param string $name_fix 前缀
         */
		private function _load_plugins( & $plugins , $name_fix = '') {
			foreach($plugins as $key => &$plugin) {
				if($plugin['access'] == 1 && $this->ci->_admin->role != 1)  { //如果插件需要访问权限为1，但角色不为 1(即不是管理员)
					unset($plugins[$key]); //删除插件
					continue;	
				}
				if($this->ci->_admin->role != 1 && !in_array('module@run',$this->ci->acl->_rights['rights']) ) { //角色不等于1(不是管理员),模块需求权限不在用户权限之内
					unset($plugins[$key]); //删除插件
					continue;	
				}
				if($this->ci->_admin->role != 1 && !in_array($plugin['name'],$this->ci->acl->_rights['plugins'])) { //角色不等于1(不是管理员),此插件需求权限不在插件需求权限之内
					unset($plugins[$key]); //删除插件
					continue;		
				}
				if(!file_exists(FCPATH.'plugins/'.$plugin['name'].'/'.'plugin_'.$name_fix.$plugin['name'].EXT)) { //如果插件文件不存在
					unset($plugins[$key]);//删除
				}
				else {
					$plugin_class = 'plugin_'.$name_fix.$plugin['name'];
					include FCPATH.'plugins/'.$plugin['name'].'/'.'plugin_'.$name_fix.$plugin['name'].EXT;
					if(class_exists($plugin_class)) { //如果类存在，则加载
						$plugin['instance'] = new $plugin_class($plugin['name']);
					}
					else {
						unset($plugins[$key]);
					}
				}
			}
		}
        
        /**
         * 插件导航
         */
		function trigger_navigation() {
			foreach($this->active_plugins as $plugin) {
				$plugin['instance']->register_navigation(); //注册
			}
		}
		
        /**
         * 插件左部菜单
         * 
         * @return array 左部菜单数组
         */
		function trigger_left_menu() {
			$left_menus = array();
			foreach($this->active_plugins as $plugin) {
				$left_menu = $plugin['instance']->register_left_menu();
				if( $left_menu ) {
					$left_menus[] = $left_menu;
				}	
			}
			return $left_menus;	
		}
		
        /**
         * 相关操作
         */
		function trigger_operation() {
			foreach($this->active_model_plugins as $plugin) {
				$plugin['instance']->register_operation();
			}	
		}
		
        /**
         * 附件
         * 
         * @param string $file 
         */
		function trigger_attachment($file) {
			foreach($this->active_plugins as $plugin) {
				$plugin['instance']->register_attachment($file);
			}	
		}
		
        /**
         * 模型方法
         * 
         * @param string $name 模型插件方法名称
         * @param string $arg1 参数1
         * @param string $arg2 参数2
         * @return 
         */
		function trigger_model_action($name = '' , & $arg1 = '' , & $arg2 = '') {
			if(!$name){return;}
			foreach($this->active_model_plugins as $plugin) {
				call_user_func_array(array(& $plugin['instance'], $name), array(& $arg1, & $arg2));
			}
		}				
	}
	
    /**
     * 插件基类
     */
	abstract class Dili_basic_plugin {
        
        /**
         * 插件名称
         * 
         * @var string 
         */
		var $_name = '';
        
        /**
         * CI引用
         * 
         * @var object 
         */
		var $_ci = NULL;
        
        /**
         * 路径
         * 
         * @var string 
         */
		var $_path = '';
		
        /**
         * 构造函数
         * 
         * @param string $name 插件名称
         */
		function __construct($name) {
			$this->_name = $name;
			$this->_ci = &get_instance();
			$this->_path = FCPATH.'plugins/'.$this->_name.'/';
		}
		
        /**
         * 生成插件的url
         * 
         * @param string $action 方法名称
         * @param string $qs 附回的字符串
         * @return string 生成的URL 
         */
		function _url($action , $qs = '') {
			return backend_url('module/run','plugin='.$this->_name.'&action='.$action).$qs;	
		}
		
        /**
         * 
         * 
         * @param type $type
         * @param type $model
         * @return type 
         */
		function _check($type = '' , $model = '') {
            return $this->_ci->uri->segment(2) == $type && $model == $this->_ci->input->get('model');
        } 
		
        /**
         * 文件内容输出
         * 
         * @param string $view 视图文件名称
         * @param string $data render数据
         * @param bool $output 是否直接输出
         * @return string 渲染之后的文件内容 
         */
		function _template($view , $data = array() , $output = true) {
			extract($data);
			ob_start();
			eval('?>'.file_get_contents($this->_path.$view.EXT));
			$content = ob_get_contents();
			ob_end_clean();
			if($output == true) {
				echo $content;
			}	
			else {
				return $content;
			}
		}
			
	}
		
	//DiliCMS MODEL插件接口
	abstract class Dili_model_plugin extends Dili_basic_plugin {
        
		function __construct($name){parent::__construct($name);}
		//注册操作栏
		function register_operation(){}
		//注册模型信息插入前操作
		function register_before_insert(){}//& $data
		//注册模型信息插入后操作
		function register_after_insert(){}//& $data ,$id
		//注册模型信息修改前操作
		function register_before_update(){}//& $data ,$id		
		//注册模型信息修改后操作
		function register_after_update(){}//& $data ,$id
		//注册模型信息删除前操作
		function register_before_delete(){}//$ids
		//注册模型信息删除后操作
		function register_after_delete(){}//$ids
		//注册模型信息添加修改页面视图
		function register_view(){}//& $content
		//注册模型信息列表QUERY之前
		function register_before_query(){}//&$where
		//注册模型信息列表数据二次处理
		function register_before_list(){}//& $list
		//注册模型信息列表显示页面
		function register_list_view(){}//& $list
		//注册模型信息列表操作栏
		function register_list_operation_view(){}// &$data
		//注册模型信息进入列表信息动作
		function register_on_reach_model_list(){}//
        
	}
	
	//DiliCMS EXTENDED 插件接口
	abstract class Dili_plugin extends Dili_basic_plugin {
		function __construct($name){parent::__construct($name);}
		//注册快速导航栏按钮
		function register_navigation(){}
		//注册左边栏菜单
		function register_left_menu(){}
		/*return   array( 'menu_name' => 'Hello World 插件',
							'sub_menus' => array(
												  0=>array('class_name'=>$this->_name,'method_name'=>'welcome','menu_name'=>'测试左菜单')
												)
						  );*/
		//注册快速导航栏按钮
		function register_attachment(){}//参数为路径
	}
	
	
	
